import random
import math

#### Klasy ####

class Konfiguracja:
    liczba_wezlow = 1
    liczba_prob = 10000
    
    p_sr = 10000.0
    p_odch = 500.0

    l_sr = 3.0
    l_odch = 1.0
    
    r_sr = 10000.0
    r_odch = r_sr/5.0

    def pasmo_dostepne(self):
        return self.p_sr
        #return math.fabs(math.ceil(random.gauss(self.p_sr, self.p_odch))) # bit/s
    
    def liczba_transmisji(self):
        return self.l_sr
        #return random.randint(2, 3)
        #return math.fabs(math.ceil(random.gauss(self.l_sr, self.l_odch)))
    
    def rozmiar_pliku(self):
        return math.fabs(math.ceil(random.gauss(self.r_sr, self.r_odch))) # bajt

class Wezel:
    pasmo_dostepne = 0.0
    liczba_transmisji = 0.0
    rozmiar_pliku = 0.0
    
    def __init__(self, konfiguracja):
        self.pasmo_dostepne = konfiguracja.pasmo_dostepne()
        self.liczba_transmisji = konfiguracja.liczba_transmisji()
        self.rozmiar_pliku = konfiguracja.rozmiar_pliku()
    
    def opoznienie(self):
        self.pasmo_dostepne = konfiguracja.pasmo_dostepne()
        self.liczba_transmisji = konfiguracja.liczba_transmisji()
        self.rozmiar_pliku = konfiguracja.rozmiar_pliku()
        return (self.liczba_transmisji * self.rozmiar_pliku * 8)/self.pasmo_dostepne

#### Funkcje ####

def licz_srednia(lista):
    suma = 0.0
    for i in range(lista.__len__()):
        suma = suma + lista[i]
    return suma/lista.__len__()
    
def odchylenie_opoznienia(srednia,lista):
        suma = 0.0
        for i in range(lista.__len__()):
                suma = suma+(lista[i]-srednia)*(lista[i]-srednia)
        return  math.sqrt(suma/(lista.__len__()-1))

#### Zmienne ####
konfiguracja = Konfiguracja()
lancuch = []
opoznienia = []

#### Konfiguracja lacza ####

for i in range(konfiguracja.liczba_wezlow):
    lancuch.append(Wezel(konfiguracja))

#### Wyliczanie sredniego opoznienia ####

for i in range(konfiguracja.liczba_prob):
    opoznienie = 0
    for k in range(konfiguracja.liczba_wezlow):
        opoznienie += lancuch[k].opoznienie()
    opoznienia.append(opoznienie)
    
srednia = licz_srednia(opoznienia)
print  '%.3f       %.3f' %(licz_srednia(opoznienia),odchylenie_opoznienia(srednia,opoznienia))

